// 导入登录、退出、获取用户资料的请求方法
import { login,
  // logout,
  getInfo } from '@/api/user'
// 读取token、设置token、移除token
import { getToken, setToken, removeToken } from '@/utils/auth'
// 重置路由
import { resetRouter } from '@/router'

// [ 核心逻辑 1 ]: 登录逻辑
// [ 核心逻辑 2 ]: 获取用户资料
// [ 核心逻辑 3 ]: 退出逻辑

const getDefaultState = () => {
  return {
    token: getToken(), // token数据信息
    userInfo: {}// 用户资料
  }
}

// state数据
const state = getDefaultState()
// mutations方法
const mutations = {
  // 重置state数据
  RESET_STATE: (state) => {
    // 合并对象方法  (第二个参数覆盖第一个参数)
    // 清空state
    Object.assign(state, getDefaultState())
  },
  // 设置token
  SET_TOKEN: (state, token) => {
    state.token = token
  },
  // 设置用户资料
  SET_USERINFO: (state, data) => {
    state.userInfo = data
  }
}
// actions方法
const actions = {
  // [ 核心逻辑 1 ]: 登录逻辑
  async login({ commit }, userInfo) {
    // 发起请求
    const res = await login(userInfo)
    console.log(res)
    // 设置token
    commit('SET_TOKEN', res.token)
    // 存储到本地
    setToken(res.token)
  },

  // [ 核心逻辑 2 ]: 获取用户资料
  async getInfo({ commit, state }) {
    const res = await getInfo()
    console.log('用户信息res:', res)
    commit('SET_USERINFO', res.userinfo)
    return res
  },

  // [ 核心逻辑 3 ]: 退出逻辑
  logout({ commit, state }) {
    // 先移除token
    removeToken()
    // 重置路由
    resetRouter()
    // 重置state
    commit('RESET_STATE')
  },

  // 移除token
  resetToken({ commit }) {
    return new Promise((resolve) => {
      removeToken() // 必须先移除token
      commit('RESET_STATE')
      resolve()
    })
  }
}
// 建立模块暴露出去
export default {
  namespaced: true,
  state,
  mutations,
  actions
}

